/* function greet(name: string) {
  return `Hello ${name}`
}
console.log(greet('吕布')) */
// 目标：这个函数接收字符串，返回的就是 "Hello 字符串"；接收数组 ['a', 'b']，返回 ['Hello a', 'Hello b']

/* function greet(name: string | string[]): string | string[] {
  if (typeof name === 'string') {
    return `Hello ${name}`
  } else if (Array.isArray(name)) {
    return name.map((item) => `Hello ${item}`)
  }
}
console.log(greet('吕布'))
console.log(greet(['吕布', '邢道荣', '潘凤'])) */

/* function greet(name: string | string[]): string | string[] {
  if (typeof name === 'string') {
    return `Hello ${name}`
  } else if (Array.isArray(name)) {
    return name.map((item) => `Hello ${item}`)
  }
}
// 期望返回的是字符串
// const result = greet('吕布')
// 这儿出来就应该是字符串相关的提示，目前并不是，其实出来是字符串和数组共有的一些属性或方法
// result
// 需要配合断言去使用，后续的提示才能更精准
const result = greet(['吕布', '邢道荣', '潘凤']) as string[]
// result. */

// 上面的代码更好的实现方式是函数重载

// 重载签名（只包含函数参数和返回指定的类型，不包含函数体）
function greet(name: string): string
// 一个函数可以有任意多个签名（不会覆盖）
function greet(name: string[]): string[]
// 重载实现/签名实现：就是一个普通的函数（参数的类型要覆盖重载前面的参数类型，返回值类型要覆盖重载前面的返回值类型）
function greet(name: unknown): unknown {
  if (typeof name === 'string') {
    return `Hello ${name}`
  } else if (Array.isArray(name)) {
    return name.map((item) => `Hello ${item}`)
  }
}
// const result = greet('吕布')
// result.
const result = greet(['吕布', '邢道荣', '潘凤'])
// result.
